import json
import time
from bs4 import BeautifulSoup
from selenium.common.exceptions import NoSuchElementException,InvalidSessionIdException,UnexpectedAlertPresentException
from selenium import webdriver
from PIL import Image
import pytesseract
from selenium.webdriver.common.by import By
PAWD="22721X"
CODE="2015301125"

def table_to_json(list_table):
    my_list=[]
    for i in list_table:
        list_col=[]
        if i[0]=='' and i[1]=='':
            list_col.append("")  #    星期一 星期二 星期三 星期四 星期五 星期六 星期日
            list_col.append(i[2].split("\n")[0])
            list_col.append(i[2].split("\n")[1])
            list_col.append(i[2].split("\n")[2])
            list_col.append(i[2].split("\n")[3])
            list_col.append(i[2].split("\n")[4])
            list_col.append(i[2].split("\n")[5])
            list_col.append(i[2].split("\n")[6])
            my_list.append(list_col)
            continue
        elif i[0]=='' and i[1]!='': # 列表第一个是空就是 上午 午休 下午 晚饭 晚上
            if len(i)==3:  # 长度为3的话，就是午休和晚饭
                list_col.append(i[1]+i[2])
                my_list.append(list_col)
                continue
            else: # 上午 下午 晚上  and   课
                list_col.append(i[1].split("\n")[1]) # 第第九节节(19: 00-19: 45)
                temp_index=0
                null_num=0 # 用于计算连续出现null的个数
                for j in i:
                    temp_index+=1
                    if j !='' and temp_index>=4: # 如果不是空就加上去
                        null_num=0 # 如果不是空了，直接清零
                        list_col.append(j.replace("\n",""))
                    # 如果连续三个‘’就加一个空，然后隔一个空继续
                    if j=="" and temp_index>=4: # 如果为空，开始计数(从第四个开始计数)
                        null_num+=1
                        if null_num==3:
                            list_col.append("")
                            null_num=-1 # 清零  因为每一个课都间隔一个空格所以赋值-1
                my_list.append(list_col)
                continue
        else: # 课
            list_col.append(i[0]) # 第第九节节(19: 00-19: 45)
            temp_index=0
            null_num=0 # 用于计算连续出现null的个数
            for j in i:
                temp_index+=1
                if j !='' and temp_index>=3: # 如果不是空就加上去
                    null_num=0 # 如果不是空了，直接清零
                    list_col.append(j.replace("\n",""))
                # 如果连续三个‘’就加一个空，然后隔一个空继续
                if j=="" and temp_index>=3: # 如果为空，开始计数(从第四个开始计数)
                    null_num+=1
                    if null_num==3:
                        list_col.append("")
                        null_num=-1 # 清零  因为每一个课都间隔一个空格所以赋值-1
            my_list.append(list_col)
            continue
    # 一周的课：
    week={}
    weekday_index=0
    for weekday in my_list[0]:
        if weekday=="":
            continue
        weekday_index+=1  # 周一是1
        day={}
        index=0
        for i in my_list:
            if len(i)>1:
                if i[weekday_index]!='' and i[0]!="":  # if是排除第一行
                    day[my_list[index][0]]=i[weekday_index]
            index+=1
        week[weekday]=day
    return(week)



def disable_block(txt):  # 验证码会出现空格，所以得作出处理
    return txt.replace(" ","")

def login(browser,number):
    browser.implicitly_wait(3)
    try:
        # 全屏
        browser.maximize_window()
    except:
        print("全屏出错")
    # 隐式等待
    browser.implicitly_wait(3)
    # 截屏
    browser.save_screenshot('code.png')
    # 获取验证码位置  起点(x.y)    大小(width,heigth)
    photo=browser.find_element(By.CSS_SELECTOR,'#vchart')
    x=photo.location['x']
    y=photo.location['y']
    width=photo.size['width']
    height=photo.size['height']
    x=850
    y=477
    width=100
    height=24
    # 打开图片截图
    im=Image.open('code.png')
    im=im.crop((x,y,x+width,y+height))
    im.save('codes.png')
    # 验证码识别
    img=Image.open('codes.png')
    img=img.convert('L')
    img=img.point(lambda x:255 if x>135 else 0)

    text='0000'
    if pytesseract.image_to_string(img):
        text=disable_block(pytesseract.image_to_string(img))
        # if len(text)!=4:
        #     print("text recognized failed, retrying...")
        #     time.sleep(1)
        #     # browser.close()
        #     login(browser,number)
        print(890098098098)
        print(text)
    else:
        print("寄")


    # 分别是输入账号密码验证码
    browser.find_element(By.CSS_SELECTOR,'body > table > tbody > tr > td > table.mainbox > tbody > tr:nth-child(1) > td:nth-child(2) > form > table > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child(1) > td:nth-child(2) > input').send_keys(CODE)
    browser.find_element(By.CSS_SELECTOR,'body > table > tbody > tr > td > table.mainbox > tbody > tr:nth-child(1) > td:nth-child(2) > form > table > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child(2) > td:nth-child(2) > input').send_keys(PAWD)
    browser.find_element(By.CSS_SELECTOR,'body > table > tbody > tr > td > table.mainbox > tbody > tr:nth-child(1) > td:nth-child(2) > form > table > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child(3) > td:nth-child(2) > input[type=text]').send_keys(text)
    # 模拟登录
    browser.implicitly_wait(6)
    browser.find_element(By.CSS_SELECTOR,'#btnSure').click()
    # print(124214)#btnSure
    try:
        try:
            browser.switch_to.alert.accept()
            # print("真有用？")
        except:
            pass
            # print("那没事儿了")
        if browser.find_element(By.CSS_SELECTOR,'body > table > tbody > tr > td > table.mainbox > tbody > tr:nth-child(1) > td:nth-child(2) > form > table > tbody > tr:nth-child(1) > td > table > tbody > tr > td > table > tbody > tr:nth-child(2) > td.errorTop'):
            print("Login failed, retrying...")
            time.sleep(3)
            # browser.close()
            login(browser,number)
    except NoSuchElementException:
        print('Login successfully')
    except UnexpectedAlertPresentException:
        # print(777)
        browser.close()
        login(browser,number)
    except InvalidSessionIdException:
        # print(888)
        browser.refresh()
        login(browser,number)
    
    # browser.implicitly_wait(3)
    # browser.maximize_window()
#  查看选课结果
    # 最上头的列表那一块的frame叫topFrame
    browser.switch_to.frame(browser.find_element(By.NAME,'topFrame'))
    # //*[@id="moduleTab"]/tbody/tr/td[3]/a
    # 点击选课管理按钮
    browser.find_element(By.XPATH,'//*[@id="moduleTab"]/tbody/tr/td[3]/a').click()
    browser.switch_to.default_content()
#  本学期课表
    # 左边框的那一块frame叫mainFrame，但是在这个外层还有一个frame 叫bottomFrame
    browser.switch_to.frame(browser.find_element(By.NAME,'bottomFrame'))
    # 进来bottomFrame之后才能到menuFrame，而且注意到这里的直接叫‘menuFrame’，而不用想上一行多加一个函数来获取了
    browser.switch_to.frame('menuFrame')
    # 然后就是点击本学期课表
    # //*[@id="project"]/table/tbody/tr[3]/td/table/tbody/tr[2]/td/table/tbody/tr[1]/td/a
    browser.find_element(By.XPATH, '//*[@id="project"]/table/tbody/tr[3]/td/table/tbody/tr[2]/td/table/tbody/tr[1]/td/a').click()
    # browser.find_element
    #########
    # # 回到上一个frame
    browser.switch_to.parent_frame()
    # # 进入mainFrame
    browser.switch_to.frame('mainFrame')
    
    table_str=browser.find_element(By.XPATH, '//*[@id="user"]/tbody').get_attribute("outerHTML")
    table_html=browser.find_element(By.XPATH, '//*[@id="user"]/tbody')
    # print(str(browser.find_element(By.XPATH, '//*[@id="user"]').get_attribute("outerHTML")))
    # print("MR. Lonely")
    # print(table_str)
    # print(9999000087868)
    pax= []
    att= []
    # 通过标签名获取表格的所有行
    table_tbody_list = table_html.find_elements(By.TAG_NAME,"tbody")
    table_tr_list = table_html.find_elements(By.TAG_NAME,"tr") # 对不起，是TAG_NAME不是NAME
    # print(33)
    # print(table_tr_list)
    for tr in table_tr_list:
        att = (tr.text).split(" ")
        pax.append(att)
    # print(44)
    # print(pax)
    print(table_to_json(pax))
    with open('new_table.json','w',encoding='utf-8') as f:#使用with open()新建对象f
        f.write(json.dumps(table_to_json(pax), sort_keys=True, indent=4, separators=(',', ':')))
        pass
    

    time.sleep(10)
    # browser.execute_script("document.body.style.zoom='0.8'")

    # browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
    # # 屏幕截图
    # browser.save_screenshot(number+'.png')
    browser.quit()
    exit(0)

def main():
    browser=webdriver.Chrome()  
    browser.implicitly_wait(3)
    browser.get('http://192.168.16.208/loginAction.do')
    # print('请输入想要查找的班级号：')
    # number=input()
    login(browser,"number")

if __name__=='__main__':
    main()
